package rabbitMq

import (
	"github.com/streadway/amqp"
	"go.uber.org/zap"
)

var conn *amqp.Connection
var queue amqp.Queue
var channel *amqp.Channel

func SendMsgToRabbitMq(msgBody string) error {
	var err error
	// 1. 尝试连接RabbitMQ，建立连接
	// 该连接抽象了套接字连接，并为我们处理协议版本协商和认证等。
	conn, err = amqp.Dial("amqp://admin:admin@localhost:5672/")
	if err != nil {
		zap.L().Error("connect to RabbitMQ failed, err:", zap.Error(err))
		return err
	}
	defer conn.Close()

	// 2. 接下来，我们创建一个通道，大多数API都是用过该通道操作的。
	channel, err = conn.Channel()
	if err != nil {
		zap.L().Error("open a channel failed, err:", zap.Error(err))
		return err
	}
	//fmt.Println("声明通道", channel)
	defer channel.Close()

	// 3. 要发送，我们必须声明要发送到的队列。
	queue, err = channel.QueueDeclare(
		"test_queue", // name
		true,         // 持久的
		false,        // delete when unused
		false,        // 独有的
		false,        // no-wait
		nil,          // arguments
	)
	//fmt.Println("声明队列", queue)
	if err != nil {
		zap.L().Error("declare a queue failed, err: ", zap.Error(err))
		return err
	}
	// 4. 然后我们可以将消息发布到声明的队列
	err = channel.Publish(
		"",         // exchange
		queue.Name, // routing key
		false,      // 立即
		false,      // 强制
		amqp.Publishing{
			DeliveryMode: amqp.Persistent, // 持久
			ContentType:  "text/plain",
			Body:         []byte(msgBody),
		})
	if err != nil {
		zap.L().Error("publish a message failed, err: ", zap.Error(err))
		return err
	}
	zap.L().Info(" [x] Sent " + msgBody)
	return nil
}
